res1 = new Dynamic {} != new Dynamic {}
res2 = new Dynamic { foo = 1 } != new Dynamic { foo = 1 }
res3 = new Dynamic { foo = 1; bar = "two" } != new Dynamic { foo = 1; bar = "two" }
res4 = new Dynamic { foo = 1; bar = "two" } != new Dynamic { bar = "two"; foo = 1 }
res5 = new Dynamic { foo = 1; bar = "two" } != new Dynamic { foo = 1; bar = "one" }
res6 = new Dynamic { foo = 1; bar = "two" } != new Dynamic { foo = 1; bar = "two"; baz = "two" }
res7 = new Dynamic { foo = 1 } != new Dynamic { bar = "two" }

local obj1 {
  foo = 1
}
local obj2 {
  foo = 1
  bar = "two"
}
local obj3 {
  bar = "two"
  foo = 1
}

res8 = (obj1) {} != new Dynamic { foo = 1 }
res9 = (obj1) { bar = "two" } != obj2
res10 = (obj1) { bar = "two" } != (obj2) {}
res11 = (obj1) { bar = "two" } != (obj2) { bar = "two" }
res12 = (obj1) { bar = "two" } != (obj2) { foo = 1 }
res13 = (obj1) { bar = "two" } != obj3
res14 = (obj1) { baz = "two" } != obj3
res15 = (obj1) { bar = "three" } != obj3

class Person {
  name = "Pigeon"
  age: Int?
  street: String
}

class Person2 {
  name = "Pigeon"
  age: Int?
  street: String
}

res16 = new Person {} != Person
res17 = new Person {} != new Person2 {}
res18 = new Person { street = "Fulton St." } != new Person { street = "Fulton St." }
res19 = new Person { street = "Fulton St." } != new Person2 { street = "Fulton St." }
res20 = new Person { age = 40; street = "Fulton St." } != new Person { street = "Fulton St."; age = 40 }
res21 = new Person { age = 80; street = "Fulton St." } != new Person { street = "Fulton St."; age = 40 }

class Person3 {
  name: String
  age: Int
  hidden street: String
}

// equal by definition
local person3_1 = new Person3 { name = "Pigeon"; age = 42 }
local person3_2 = new Person3 { name = "Pigeon"; age = 42; street = "Fox St." }
local person3_3 = new Person3 { name = street; age = 42; street = "Pigeon" }

res22 = person3_1 != person3_2
res23 = person3_2 != person3_1
res24 = person3_1 != person3_3
res25 = person3_3 != person3_1

class Person4 {
  name: String
  age: Int
  hidden street: String
  hidden hobby: String
}

// equal by definition
local person4_1 = new Person4 { name = "Pigeon"; age = 42 }
local person4_2 = new Person4 { name = "Pigeon"; age = 42; street = "Fox St." }
local person4_3 = new Person4 { name = "Pigeon"; age = 42; street = "Fox St."; hobby = "swimming" }

res26 = person4_1 != person4_2
res27 = person4_2 != person4_3
res28 = person4_3 != person4_1
